package jmine.tec.utils.collection;

import java.util.Comparator;

import org.apache.commons.lang.StringUtils;

/**
 * Compara dois elementos pelo texto gerado no método {@link #toString()}. <br>
 * São ignorados os espaços laterais do texto (efetua {@link String#trim()} antes de comparar).
 * 
 * @author wellington.santos
 * @created Mar 28, 2012
 */
public class StringComparator implements Comparator<Object> {

    /**
     * Instância singleton.
     */
    public static final StringComparator INSTANCE = new StringComparator();

    /**
     * Instância para efetuar comparação de texto ignorando maúsculas/minúsculas.
     */
    public static final StringComparator INSENSITIVE_INSTANCE = new StringComparator() {
        @Override
        protected int compare(String a, String b) {
            return a.compareToIgnoreCase(b);
        }
    };

    /**
     * {@inheritDoc}
     * 
     * @return {@inheritDoc}
     */
    public int compare(Object a, Object b) {
        if (b == null) {
            return 1;
        }
        if (a == null) {
            return -1;
        }
        int h = this.compare(StringUtils.trimToEmpty(a.toString()), StringUtils.trimToEmpty(b.toString()));
        if (h != 0) {
            return h;
        }
        if (a.equals(b)) {
            return 0;
        }
        return System.identityHashCode(a) - System.identityHashCode(b);
    }

    /**
     * {@inheritDoc}
     */
    protected int compare(String a, String b) {
        return a.compareTo(b);
    }
}
